home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / docs / asm_guide / assembler course / 8.s < prev    next >
Text File  |  1992-04-27  |  5KB  |  152 lines

  1.  
  2. ; after 7 boring programs, it's time for action. I suppose you know
  3. ; enough about STACK, SUBROUTINES, ADRESSING METHODS, and LIBRARIES
  4. ; so it's time to make a small DEMO !!!!
  5. ; We will need a whole lot of 'hardware-numbers' these are addresses
  6. ; that have a special function. You already encountered the $bfe001
  7. ; which was used to check left mousebutton, $dff016 for right mouse
  8. ; and $dff180 and $dff182 for both background and textcolor.
  9. ; We will add some to this list in this program. Don't worry, I'll
  10. ; send (or maybe you already have it) a list with all these addreses
  11. ; and their function.
  12.  
  13. ; The lesson that now follows is, as we said, about HARDWARE-RELATED
  14. ; stuff. It's therefore important that I tell you about this hardware
  15. ; Amiga uses some extra chips for things like gfx, sound, disk access
  16. ; etc...  One of these 'extra' chips is the Copper (in fact copper
  17. ; is only PART of a chip, but who cares)
  18. ; The copper is a very 'dumb' chip, it can only do 3 things, of which
  19. ; one thing is never used. (which makes it does only 2 things)
  20. ; The copper can 'WAIT' and 'MOVE'. 
  21. ;  WAITING: you can tell copper to wait for the 'beam' of the monitor
  22. ;        to reach a certain position. For example:
  23. ;        'wait for line 10'
  24. ;  MOVING:  You can say: put this value in this address. 
  25. ;        The addresses you can write to are limited to the 
  26. ;        hardware registers, like for example the color-addresses
  27. ;        $dff180 and $dff182. In fact all the addresses that are
  28. ;        accessable with copper start with '$dff', and therefor
  29. ;        these 3 digits are never written in a copper-program.
  30. ; THAT'S ALL !!
  31. ;
  32. ; Copper has it's own language. The Seka assembler translates 
  33. ; commands like 'JMP' in numbers, like $4ef9, but the instructions
  34. ; of the copper aren't supported, so we will just have to write
  35. ; the numbers ourselves. This list of numbers (the copper-program)
  36. ; is called a 'COPPERLIST'  Writing such a list isn't too hard, coz
  37. ; only 2 commands are used, as I told you.
  38.  
  39. ; This examplesource will contain such a copperlist: have a look...
  40. ; You'll need almost everything you have learned 'till now, so be
  41. ; prepared. It won't be easy... If something is not clear, refer 
  42. ; back to somewhere where it was explained.  You should be familiar
  43. ; to the addressing methods etc by now.
  44.  
  45.  
  46. top:    movem.l    d0-d7/a0-a6,-(a7)    ; you guessed right...
  47.                     ; save the registers !
  48.  
  49.     move.l    $4,a6        ; the start of the execlib to A6
  50.     move.l    #libname,a1    ; the name of the library is here...
  51.     jsr    -408(a6)    ; openlibrary
  52.     move.l    d0,gfxbase    ; store the result in gfxbase
  53.  
  54.     ; the next 4 lines cause our own copperlist to be 'executed'
  55.     ; from now on. The 2 lines with *** are very difficult to 
  56.     ; explain at this moment. I'll do it next time, when we will
  57.     ; discuss all the hardware registers.  Notice that the
  58.     ; values are here in binary notation. (%)
  59.  
  60.     move.w    #%0000001110100000,$dff096    ; ***
  61.  
  62.     move.l    #copperlist,$dff080    ; these 2 lines
  63.     clr.w    $dff088            ; effectively start our list
  64.  
  65.     move.w    #%1000001010000000,$dff096    ; ***
  66.  
  67.     ; now, wait for a mouseclick...
  68.  
  69. loop:    btst    #6,$bfe001
  70.     bne.s    loop
  71.  
  72.     ; something I didn't tell yet: at ofset +38 of the gfxlib is
  73.     ; the address of the current copperlist. After you've 
  74.     ; installed your own copperlist, you can find the old one
  75.     ; here, and put this one back to work, so you can return
  76.     ; properly. Let's do it:
  77.  
  78.     move.l    gfxbase,a6        ; a6 = start of gfxlib !
  79.     move.l    38(a6),$dff080        ; turn the old copperlist
  80.     clr.w    $dff088            ; back on...
  81.  
  82.     move.w    #%1000001111100000,$dff096    ; ***
  83.  
  84.     ; and close the gfxlibrary:
  85.  
  86.     move.l    $4,a6            ; we need exec again !
  87.     move.l    gfxbase,a1
  88.     jsr    -414(a6)
  89.  
  90.     movem.l    (a7)+,d0-d7/a0-a6
  91.     rts
  92.  
  93.  
  94. libname:    dc.b    "graphics.library",0
  95.         even
  96. gfxbase:    dc.l    0    ; reserve a longword for the
  97.                 ; start of the library
  98.  
  99. ; here follows the copperlist. As I said, there are only 2 commands:
  100. ; The WAIT command looks as follows:
  101. ;
  102. ;    dc.w    $yyxx,$fffe    (or    dc.l  $yyxxfffe)
  103. ;
  104. ; yy is the number of the line you wish to wait for: from $0 to $ff
  105. ; xx is horizontal position. The 'resolution' is 8 pixels: you can
  106. ; only wait for pixel 1,8,16,...  xx must be an odd numer, ranging
  107. ; from $0f (left side) to ??? (I dunno exactly the right side)
  108. ; I almost always use 0f as horizontal position...
  109. ; The $fffe is the characteristic of the WAIT command. Example:
  110. ;
  111. ;    dc.l    $100ffffe
  112. ;
  113. ; waits for line $10 (=16), leftmost side...
  114. ;
  115. ; NOW the MOVE command:
  116. ;
  117. ;    dc.w    $aaaa,$bbbb     (or     dc.l   $aaaabbbb)
  118. ;
  119. ; aaaa is the hardware register you wanna move bbbb in. We already
  120. ; had the hardware registers $dff180 and $dff182, the colors...
  121. ; If we wanna move $0888 (grey) to these registers, the copperlist
  122. ; would look as follows:
  123. ;
  124. ;    dc.l    $01800888
  125. ;    dc.l    $01820888
  126. ;         ^^^^
  127. ;        registers
  128. ;             ^^^^
  129. ;            values
  130. ;
  131. ; THE LAST LINE OF A COPPERLIST IS ALWAYS $FFFFFFFE, which is a wait
  132. ; instruction. 'Wait for FFFF', this is an impossible position, and
  133. ; it represents the end of the copperlist.
  134. ;
  135. ; HERE WE GO WITH A COMBINATION:
  136.  
  137. copperlist:
  138.     dc.l    $200ffffe    ; wait for line $20, horiz $0f
  139.     dc.l    $01800000    ; color background ($dff180) to $000
  140.     dc.l    $400ffffe
  141.     dc.l    $01800222
  142.     dc.l    $600ffffe
  143.     dc.l    $01800444
  144.     dc.l    $800ffffe    ; wait for line $80
  145.     dc.l    $01800666    ; background color to $0666
  146.     dc.l    $a00ffffe
  147.     dc.l    $01800888
  148.     dc.l    $c00ffffe
  149.     dc.l    $01800aaa
  150.     dc.l    $fffffffe    ; end of copperlist
  151.  
  152.